package br.com.pi.SmartFast.controler;

import br.com.pi.SmartFast.model.Mesa;
import br.com.pi.SmartFast.model.MesaDAO;
import br.com.pi.SmartFast.model.Pedidos;
import br.com.pi.SmartFast.model.PedidosDAO;
import br.com.pi.SmartFast.model.Produto;
import br.com.pi.SmartFast.model.TipoProduto;
import java.awt.Image;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

/**
 *
 * @author Alessandro
 */
public class ControleBar implements Runnable {

    private JList lista_bebidas, lista_auxilio;
    private JFrame tela;
    private JDialog dial_consulta;
    private DefaultListModel model_bebida = new DefaultListModel();
    private DefaultListModel model_ajuda = new DefaultListModel();
    private PedidosDAO dao = new PedidosDAO();
    private JTree arvore;
    private JLabel lbl_imagem_produto;

    public ControleBar(JList lista_bebidas, JList lista_auxilio, JTree arvore, JFrame tela, JDialog dial_consulta, JLabel imagem_produto) {
        this.lista_bebidas = lista_bebidas;
        this.lista_auxilio = lista_auxilio;
        this.arvore = arvore;
        this.tela = tela;
        this.dial_consulta = dial_consulta;
        this.lbl_imagem_produto = imagem_produto;
    }

    public void TelaAoAbrir() {

        try {
            this.tela.setExtendedState(JFrame.MAXIMIZED_BOTH);
            Thread t1 = new Thread(this);
            t1.start();
            t1.setPriority(10);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao abrir tela inicial!!", "Inicia Tela", JOptionPane.ERROR_MESSAGE);
        }

    }

    public void ListaBebidasAoClicar(int clique) {

        try {
            if (clique == 2) {
                this.dial_consulta.setBounds(120, 120, 800, 600);
                this.dial_consulta.setVisible(true);
                this.getRelacaoProdutosPedidos();
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possivel abrir tela de pedidos!!", "Pedidos", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void jTreeArvoreAoClicar() {
        try {
            this.getRetornaImagemProduto();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao clicar", "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void botaoFecharDialogoProdutos() {
        this.dial_consulta.setVisible(false);
    }

    public void botaoBebidaEntregue() {
        try {
            this.setPedidoEntregue();
            this.getPedidosBebidas();
        } catch (Exception e) {
            
        }

    }

    public void botaoSolicitacaoEntregue(){
        try{
            this.setSolicitacaoEntregue();
            this.getPedidosBebidas();
        }catch(Exception e){

        }
    }

    @SuppressWarnings("static-access")
    public void run() {

        try {
            while (true) {
                this.getPedidosBebidas();
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException ex) {
                }
            }
        } catch (Exception e) {
        }
    }

    private void getPedidosBebidas() throws Exception {


        this.model_ajuda.clear();
        this.lista_auxilio.removeAll();
        this.model_bebida.clear();
        this.lista_bebidas.removeAll();

        String sql = "select distinct pd.fk_mesa as mesa"
                + " from pedidos as pd, produtos as prod"
                + " where pd.ped_atendido is false and "
                + " prod.fk_tipo_produto = 3 and"
                + " pd.fk_produtos = prod.id_produtos"
                + " order by pd.data_hora ";

        ResultSet rs = dao.getDadosTabela(sql);

        if (rs.next()) {
            do {
                this.model_bebida.addElement("MESA : " + rs.getInt("mesa"));
            } while (rs.next());
            this.lista_bebidas.setModel(model_bebida);
        }
        rs.close();

        sql = "select id_mesa as mesa"
                + " from mesa"
                + " where ajuda_garcom is true ";

        rs = dao.getDadosTabela(sql);

        if (rs.next()) {
            do {
                this.model_ajuda.addElement("MESA : " + rs.getInt("mesa"));

            } while (rs.next());
            this.lista_auxilio.setModel(model_ajuda);
            rs.close();
        }


    }

    private int getNumeroMesa() throws Exception {

        int n_mesa = 0;

        if (this.lista_bebidas.isSelectedIndex(this.lista_bebidas.getSelectedIndex())) {
            String mesa = this.lista_bebidas.getSelectedValue().toString().substring(7);
            n_mesa = Integer.parseInt(mesa);
        }
        return n_mesa;
    }

    private int getNumeroMesaGarcom() throws Exception {

        int n_mesa = 0;

        if (this.lista_auxilio.isSelectedIndex(this.lista_auxilio.getSelectedIndex())) {
            String mesa = this.lista_auxilio.getSelectedValue().toString().substring(7);
            n_mesa = Integer.parseInt(mesa);
        }
        return n_mesa;
    }

    private void getRelacaoProdutosPedidos() throws Exception {

        String produto = "";//nome do produto
        DefaultMutableTreeNode tronco = null;//tronco da arvore
        DefaultMutableTreeNode galho = null;//galhos do tronco
        this.arvore.setModel(null);//inicializa o JTree

        //consulta sql para retornar quantidade e produto com base em uma mesa
        String sql = "select ped.quantidade_prod as quant , prod.nome as nome, prod.id_produtos as id"
                + " from produtos as prod, pedidos as ped"
                + " where ped.fk_mesa = " + this.getNumeroMesa() + " and  ped.ped_atendido is false and "
                + " prod.id_produtos = ped.fk_produtos and " +
                " prod.fk_tipo_produto = 3";

//declaro a raiz da árvore
        DefaultMutableTreeNode raiz = new DefaultMutableTreeNode("Pedidos");

        ResultSet rs = this.dao.getDadosTabela(sql);//rs recebe a consulta do banco

        if (rs.next()) {//se existir informações
            do {
                produto = rs.getString("nome");//variavel recebe o nome do produto pedido
                //tronco da árvore recebe a quant. produto e o nome do mesmo
                tronco = new DefaultMutableTreeNode(rs.getInt("quant") + "  " + rs.getString("nome") + " /" + rs.getInt("id"));
                //pesquiso no banco pelos itens do produto
                ResultSet rsi = this.dao.getDadosTabela("select it.nome as item"
                        + " from itens as it, itens_produto as ip, produtos as pd"
                        + " where pd.nome like '" + produto + "' and "
                        + " it.id_itens = ip.fk_id_itens and"
                        + " ip.fk_id_produtos = pd.id_produtos ");
                if (rsi.next()) {//se existirem itens cadastrados
                    do {
                        // galhos do tronco recebem os itens do produto
                        galho = new DefaultMutableTreeNode(rsi.getString("item"));
                        //tronco adiciona os galhos criados
                        tronco.add(galho);
                    } while (rsi.next());//encerra o laço de itens
                }
                rsi.close();//fecha a consulta de itens
                raiz.add(tronco);//raiz adiciona o tornco com seus galhos
            } while (rs.next());//encerra o laço de produtos
        }
        if (!rs.isClosed()) {
            rs.close();//fecha a consulta de produtos
        }
        //Estou criando um modelo de árvore para inserir no JScrollPane da tela
        DefaultTreeModel modelo = new DefaultTreeModel(raiz);
        //Árvore insere o modelo com as informações ganhas na consulta ao banco
        this.arvore.setModel(modelo);

    }

    /**Método para inserir imagem do produto em label na tela produtos / itens
     *
     * @throws SQLException
     */
    private void getRetornaImagemProduto() throws SQLException {

        //resgata da tela o nome do produto com seu código no banco  de dados
        String produto = this.arvore.getAnchorSelectionPath().getLastPathComponent().toString();

        Integer cod = this.getCodigoProduto(produto);

        if (cod != null) {
            StringBuilder sb = new StringBuilder("select foto from produtos where id_produtos = " + cod);
            ResultSet rs = this.dao.getDadosTabela(sb.toString());

            if (rs.next()) {
                if (rs.getBytes("foto") != null) {
                    Image img = new ImageIcon(rs.getBytes("Foto")).getImage();
                    this.lbl_imagem_produto.setIcon(new ImageIcon(img));

                }
            }
            if(!rs.isClosed()){
                rs.close();
            }
        } else {
            this.lbl_imagem_produto.setIcon(new ImageIcon("src/br/com/pi/SmartFast/imagens/imgBar.png"));
        }


    }

    /**Método próprio a retornar o código do produto em uma relação quant/produto de uma lista
     * de produtos a serem atendidos
     * @param texto
     * @return
     */
    private Integer getCodigoProduto(String texto) {

        if (texto.contains("/")) {
            String[] cod = texto.split("/");
            return Integer.parseInt(cod[1]);
        } else {
            return null;
        }
    }

    private void setPedidoEntregue() throws Exception {

        Mesa ms = new Mesa();
        ms.setCod_mesa(this.getNumeroMesa());

        Produto prod = new Produto();
        TipoProduto tip = new TipoProduto();
        tip.setCodigo_tipo(3);
        prod.setTipo_produto(tip);


        Pedidos pd = new Pedidos();
        pd.setPed_atendido(true);
        pd.setProduto(prod);
        pd.setMesa(ms);

        PedidosDAO pdao = new PedidosDAO();
        pdao.EditarPedidos(pd);

    }

    private void setSolicitacaoEntregue()throws Exception{

        Mesa ms = new Mesa();
        MesaDAO msdao = new MesaDAO();

        ms.setAjuda_garcom(false);
        ms.setCod_mesa(this.getNumeroMesaGarcom());
        
        msdao.AjudaGarcom(ms);


    }
}
